1 package edu.jiangxin.apktoolbox.file;
2
3 import edu.jiangxin.apktoolbox.file.core.EncoderConvert;
4 import edu.jiangxin.apktoolbox.file.core.EncoderDetector;
5 import edu.jiangxin.apktoolbox.swing.extend.autocomplete.AutoCompleteComboBox;
6 import edu.jiangxin.apktoolbox.swing.extend.EasyPanel;
7 import edu.jiangxin.apktoolbox.swing.extend.FileListPanel;
8 import edu.jiangxin.apktoolbox.utils.Constants;
9 import edu.jiangxin.apktoolbox.utils.FileUtils;
10 import org.apache.commons.lang3.StringUtils;
11
12 import javax.swing.*;
13 import java.awt.*;
14 import java.awt.event.*;
15 import java.io.File;
16 import java.io.IOException;
17 import java.nio.charset.Charset;
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.Set;
21 import java.util.TreeSet;
22
23
24
25
26
27
28 public class EncodeConvertPanel extends EasyPanel {
29 private static final long serialVersionUID = 1L;
30
31 private FileListPanel srcPanel;
32
33 private JPanel optionPanel;
34
35 private JTextField suffixTextField;
36
37 private JCheckBox autoDetectCheckBox;
38
39 private AutoCompleteComboBox<String> fromComboBox;
40
41 private JCheckBox recursiveCheckBox;
42
43 private AutoCompleteComboBox<String> toComboBox;
44
45 private JPanel operationPanel;
46
47 public EncodeConvertPanel() throws HeadlessException {
48 super();
49 }
50
51 @Override
52 public void initUI() {
53 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
54
55 createSrcPanel();
56 add(srcPanel);
57 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
58
59 createOptionPanel();
60 add(optionPanel);
61 add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
62
63 createOperationPanel();
64 add(operationPanel);
65 }
66
67 private void createSrcPanel() {
68 srcPanel = new FileListPanel();
69 srcPanel.initialize();
70 }
71
72 private void createOptionPanel() {
73 optionPanel = new JPanel();
74 optionPanel.setLayout(new BoxLayout(optionPanel, BoxLayout.X_AXIS));
75
76 JLabel suffixLabel = new JLabel("Suffix:");
77 optionPanel.add(suffixLabel);
78 optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
79
80 suffixTextField = new JTextField();
81 suffixTextField.setToolTipText("an array of extensions, ex. {\"java\",\"xml\"}. If this parameter is empty, all files are returned.");
82 suffixTextField.setText(conf.getString("encodeconvert.suffix"));
83 optionPanel.add(suffixTextField);
84 optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
85
86 recursiveCheckBox = new JCheckBox("Recursive");
87 recursiveCheckBox.setSelected(true);
88 optionPanel.add(recursiveCheckBox);
89 optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
90
91 JLabel fromLabel = new JLabel("From:");
92 optionPanel.add(fromLabel);
93 optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
94
95 fromComboBox = new AutoCompleteComboBox<String>();
96 fromComboBox.initialize();
97 fromComboBox.setEnabled(false);
98 optionPanel.add(fromComboBox);
99 optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
100
101 autoDetectCheckBox = new JCheckBox("Auto Detect");
102 autoDetectCheckBox.setSelected(true);
103 autoDetectCheckBox.addItemListener(e -> fromComboBox.setEnabled(!(e.getStateChange() == ItemEvent.SELECTED)));
104 optionPanel.add(autoDetectCheckBox);
105 optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
106
107 JLabel toLabel = new JLabel("To:");
108 optionPanel.add(toLabel);
109 optionPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
110
111 toComboBox = new AutoCompleteComboBox<String>();
112 toComboBox.initialize();
113 toComboBox.setSelectedItem(conf.getString("encodeconvert.to"));
114 optionPanel.add(toComboBox);
115
116 for (String charset : Charset.availableCharsets().keySet()) {
117 fromComboBox.addItem(charset);
118 toComboBox.addItem(charset);
119 }
120 }
121
122 private void createOperationPanel() {
123 operationPanel = new JPanel();
124 operationPanel.setLayout(new BoxLayout(operationPanel, BoxLayout.X_AXIS));
125 JButton convertButton = new JButton("Convert");
126 convertButton.addActionListener(new ConvertButtonActionListener());
127
128 operationPanel.add(convertButton);
129 }
130
131 private class ConvertButtonActionListener implements ActionListener {
132 @Override
133 public void actionPerformed(ActionEvent e) {
134 conf.setProperty("encodeconvert.suffix", suffixTextField.getText());
135 conf.setProperty("encodeconvert.to", toComboBox.getSelectedItem().toString());
136
137 try {
138 List<File> fileList = new ArrayList<>();
139 for (File file : srcPanel.getFileList()) {
140 String[] extensions = null;
141 if (StringUtils.isNotEmpty(suffixTextField.getText())) {
142 extensions = suffixTextField.getText().split(",");
143 }
144 fileList.addAll(FileUtils.listFiles(file, extensions, recursiveCheckBox.isSelected()));
145 }
146 Set<File> fileSet = new TreeSet<>(fileList);
147 fileList.clear();
148 fileList.addAll(fileSet);
149
150 for (File file : fileList) {
151 String fromEncoder;
152 if (autoDetectCheckBox.isSelected()) {
153 fromEncoder = EncoderDetector.judgeFile(file.getCanonicalPath());
154 } else {
155 fromEncoder = fromComboBox.getSelectedItem().toString();
156 }
157 String toEncoder = toComboBox.getSelectedItem().toString();
158 logger.info("processing: {} from {} to {}", file.getCanonicalPath(), fromEncoder, toEncoder);
159 EncoderConvert.encodeFile(file.getCanonicalPath(), fromEncoder, toEncoder);
160 logger.info("processed");
161 }
162
163 logger.info("convert finish");
164 } catch (IOException e1) {
165 logger.error("convert fail", e1);
166 }
167 }
168 }
169 }